package top.milkbox.core;


import java.util.List;
import java.util.Scanner;
import java.util.function.Supplier;

/**
 * 控制台菜单控制工具类
 * <p>
 * 创建时间：2023年2月14日
 * 最后修改：2023年2月14日
 *
 * @author guo
 */
public class UtilsConsoleMenu {

    public enum ReturnFlag {
        CONTINUE, // 继续当前菜单
        EXIT, // 退出循环
        UNDEFINE // 未识别指令
    }


    public static void menuController(UtilsString.Menu menu, String exitFlag,
                                      Supplier<String> otherMenu, MenuPredicate<String> predicate) {
        Scanner scanner = new Scanner(System.in);
        String option; // 用户输入的指令
        while (true) {
            System.out.println();
            menu.printMenu(); // 打印菜单
            // 打印其他内容
            if (otherMenu != null) {
                String otherMenuString = otherMenu.get();
                if (otherMenuString != null) System.out.println(otherMenuString);
            }
            System.out.print("请输入命令：");
            option = scanner.next();
            if (!option.equals(exitFlag)) {
                ReturnFlag returnFlag = predicate.test(option, scanner);
                if (returnFlag == ReturnFlag.CONTINUE) {
                    System.out.println("请继续...");
                } else if (returnFlag == ReturnFlag.EXIT) {
                    break;
                } else if (returnFlag == ReturnFlag.UNDEFINE) {
                    printlnWarnStay("请输入正确的命令！！！！");
                }
            } else {
                break;
            }
        }
    }

    public static void menuController(List<UtilsString.Menu.Option> optionList, Supplier<String> otherMenu,
                                      MenuPredicate<String> predicate) {
        menuController(new UtilsString.Menu(optionList), "0", otherMenu, predicate);
    }

    public static void menuController(List<UtilsString.Menu.Option> optionList, MenuPredicate<String> predicate) {
        menuController(new UtilsString.Menu(optionList), "0", null, predicate);
    }

    public static void menuController(UtilsString.Menu menu, Supplier<String> otherMenu, MenuPredicate<String> predicate) {
        menuController(menu, "0", otherMenu, predicate);
    }

    public static void menuController(UtilsString.Menu menu, MenuPredicate<String> predicate) {
        menuController(menu, "0", null, predicate);
    }

    /**
     * 菜单专用函数式接口
     *
     * @param <T> 参数1
     */
    @FunctionalInterface
    public interface MenuPredicate<T> {
        /**
         * 定义要进行的详细操作
         *
         * @param t       一般是用户在控制台中的输入信息，可以自定义
         * @param scanner Scanner类
         * @return 返回的操作
         */
        ReturnFlag test(T t, Scanner scanner);
    }

    /**
     * 打印一句话并停留一会，带有颜色
     *
     * @param message 打印的内容
     * @param millis  停留多长时间，单位毫秒
     */
    public static void printlnWarnStay(String message, long millis) {
        System.err.println(message);
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void printlnWarnStay(String message) {
        printlnWarnStay(message, 1000);
    }

}
